#ifndef __PROJECT_H__
#define __PROJECT_H__

// Qt Includes
#include <QList>
#include <QMap>
#include <QObject>
#include <QProcess>
#include <QSet>
#include <QStringList>

// Qt Declarations
class QDomDocument;

// Local Declarations
class CFileLister;
class CPluginProcess;

// External Declarations
class CPlugin;
class CResults;

// ******************************************************************
// CProject
// ******************************************************************
class CProject : public QObject
{
	Q_OBJECT

public:
/////////////////////////////////////////////////////////////////////
// Construction & Destruction
/////////////////////////////////////////////////////////////////////
	CProject(const QDomDocument &xmlDocument, // Project XML.
			const QString &strSourcePath,
			QObject *pParent = NULL);
	CProject(QObject *pParent = NULL);
	~CProject();
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
// Member Functions
/////////////////////////////////////////////////////////////////////
	bool loadProjectFromXml(const QDomDocument &xmlDocument);
	QString getResultsPath() const;
/////////////////////////////////////////////////////////////////////

signals:
/////////////////////////////////////////////////////////////////////
// Signals
/////////////////////////////////////////////////////////////////////
	void projectProgress(int nCurrent, int nTotal, const QString &strHint);
	void projectFinished();
/////////////////////////////////////////////////////////////////////

public slots:
/////////////////////////////////////////////////////////////////////
// Public Slots
/////////////////////////////////////////////////////////////////////
	void startProject();
	void tick();
/////////////////////////////////////////////////////////////////////

private slots:
/////////////////////////////////////////////////////////////////////
// Private Slots
/////////////////////////////////////////////////////////////////////
	void pluginFinished(int nExitCode, QProcess::ExitStatus eExitStatus);
/////////////////////////////////////////////////////////////////////

private:
/////////////////////////////////////////////////////////////////////
// Enumerations
/////////////////////////////////////////////////////////////////////
	enum tProjectState
	{
		PROJECT_STATE_INIT,
		PROJECT_STATE_IDLE,
		PROJECT_STATE_SCANNING_FILES,
		PROJECT_STATE_RUNNING,
		PROJECT_STATE_DONE
	};

	enum tProjectRequest
	{
		PROJECT_REQUEST_START = 0x01
	};
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
// Member Functions
/////////////////////////////////////////////////////////////////////
	void setState(tProjectState eProjectState);
	void makeRequest(quint8 nRequest);
	bool isRequestActive(quint8 nRequest,
		bool bClearRequest = true);
	void addResult(const QString &strOutput);
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
// Member Variables
/////////////////////////////////////////////////////////////////////
	QList<CPlugin*> m_lstPlugins;
	QString m_strSourcePath;
	tProjectState m_eProjectState;
	quint8 m_nRequest;
	CFileLister *m_pFileLister;
	QStringList m_slPluginNames;
	QStringList m_slFilePaths;
	int m_nCurrentFileIndex;
	QSet<CPluginProcess*> m_setRunningProcesses;

	CResults *m_pResults;
	QMap<QString, quint32> m_mapPluginID;
	QMap<QString, quint32> m_mapFileNameID;
/////////////////////////////////////////////////////////////////////
};

#endif // #ifndef __PROJECT_H__
